home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / Serious Demos / Symbolic Composer 4.2 / Environment / System / DEF / Process / Transform / do-section < prev    next >
Lisp/Scheme  |  1998-10-23  |  6KB  |  137 lines

  1. do-section
  2.  
  3. do-section disributes an operation over a range of a section. The operation can be any symbol or vector processor. do-section gives you a wide variety of ways to operate on section ranges. The following applies a given operation, here '(symbol-transpose 1 x), to all zones. The list must be quoted and the parameter x MUST be used to represent the symbol-pattern or vector pattern parameter.
  4.  
  5. (setq section '((a a a) (b b b) (c c c) (d d d)))
  6. (do-section :all
  7.            '(symbol-transpose 1 x)
  8.             section)
  9. --> ((b b b) (c c c) (d d d) (e e e))
  10.  
  11. The operation can also be a nested form like:
  12.  
  13.      '(symbol-transpose 1 (symbol-retrograde x))
  14.  
  15. A section can also be a flat list of values. This case only the :all operation is applied on all the list. do-section is not designed to handle operations that occur only in a portions of the pattern. Neurons, eval-shield and subseq/replace are more specific tools for doing detailed work. The following flat list operations are supported so that all section operations whether applied to zoned or flat patterns will perform the same way.
  16.  
  17. (do-section '(x)
  18.            '(symbol-transpose 1 x)
  19.             '(a b c)) ; flat pattern input
  20. --> (b c d)           ; output also a flat pattern
  21.  
  22. (do-section :all
  23.            '(symbol-transpose 1 x)
  24.             '(a b c))
  25. --> (b c d)
  26.  
  27. A distribution pattern here is like the distribution pattern used in distribute. Here it makes a mask that lets the function distribute operation only a given portion of the section. The pattern is repeated if there are more zones than there are elements in the pattern.
  28.  
  29. (setq section '((a a a) (b b b) (c c c) (d d d)))
  30.  
  31. (do-section '(x =) 
  32.             '(symbol-transpose 2 x)
  33.             section)
  34. --> ((c c c) (b b b) (e e e) (d d d))
  35.  
  36. Sometimes it is needed to be able to let the function operate on all but the very first zones. This is realized by giving the number of zones to be skipped as the first argument.
  37.  
  38. (do-section 1
  39.             '(symbol-transpose 10 x)
  40.             section)
  41. --> ((a a a) (l l l) (m m m) (n n n))
  42.  
  43. A range can be specified as the starting zone and ending zone in the following way. Here the operation is distributed on the zones starting from second to third.
  44.  
  45. (do-section '(2 3) '(symbol-transpose 10 x)
  46.             section)
  47. --> ((a a a) (l l l) (m m m) (d d d))
  48.  
  49. You can also specify the range as a specific start element and :end element, as in the following.
  50.  
  51. (do-section '(2 :end) '(symbol-transpose 10 x)
  52.             section)
  53. --> ((a a a) (l l l) (m m m) (n n n))
  54.  
  55. An example within def-class.
  56.  
  57. (def-class symbol piano
  58.    intro '((a a a) (b b b) (c c c) (d d d))
  59.    part1 (do-section '(x = x x) 
  60.                      '(symbol-transpose 10 x)
  61.                      (same-as intro))
  62.  
  63. This creates the following bindings.
  64.  
  65. (same-as symbol of piano in intro)
  66. --> ((a a a) (b b b) (c c c) (d d d))
  67. (same-as symbol of piano in part1)
  68. --> ((k k k) (b b b) (m m m) (n n n))
  69.  
  70. Random variations over the section can be realized with the aid of pick-random. Both the distribution pattern and the function can be selected from a list of possibilities.
  71.  
  72. (do-section (pick-random '((x =) (= x) (x x =)))
  73.             (pick-random '((symbol-transpose 1 x) 
  74.                       (symbol-retrograde x)))
  75.             '((a b c) (d e f) (g h i) (j k l)))
  76.  
  77. --> ((c b a) (d e f) (i h g) (j k l))
  78. --> ((a b c) (e f g) (g h i) (k l m))
  79. --> ((c b a) (f e d) (g h i) (l k j))
  80.  
  81. The values could be also calculated when used within list function. Note that any zone symbol other than = will be processed, so you may use any symbol patterns as distribution pattern.
  82.  
  83. (do-section 
  84.  (pick-random 
  85.   (list (gen-fibonacci 3 'a '=) (gen-fibonacci 3 '= 'x)))
  86.  '(symbol-transpose 1 x)
  87.  '((a b c) (d e f) (g h i) (j k l) (a b c) (d e f) (g h i)))
  88.  
  89. --> ((b c d) (d e f) (h i j) (k l m) (a b c) (e f g) (g h i))
  90. --> ((a b c) (e f g) (g h i) (j k l) (b c d) (d e f) (h i j))
  91.  
  92. 'Missusing' this ables you to modificate flat symbol pattern ranges in the same way.
  93.  
  94. (flatten 
  95.  (do-section 
  96.     (pick-random 
  97.        (list (gen-fibonacci 3 'a '=) (gen-fibonacci 3 '= 'x)))
  98.  '(symbol-transpose 1 x)
  99.  (symbol-divide 2 nil nil '(a b c d e f g h))))
  100.  
  101. --> (b c c d f g h i)
  102. --> (a b d e e f g h)
  103.  
  104. Using get-random it is possible to build a list of begin/end values that control the zones where the operation is distributed. In the following the start zone varies from 1 to 3 and the distribution length varies from 2 to 3.
  105.  
  106. (do-section (list (setq r1 (get-random 1 3)) 
  107.               (+ r1 (get-random 1 2)))
  108.             '(symbol-transpose -5 x)
  109.             '((a a a) (b b b) (c c c) (d d d) (e e e) (f f f)))
  110.  
  111. --> ((a a a) (-e -e -e) (-d -d -d) (d d d) (e e e) (f f f))
  112. --> ((a a a) (-e -e -e) (-d -d -d) (-c -c -c) (e e e) (f f f))
  113. --> ((a a a) (b b b) (-d -d -d) (-c -c -c) (-b -b -b) (f f f))
  114.  
  115. (setq section '((1 2 3) (4 5 6) (7 8 9) (10 11 12)))
  116. (do-section '(x =) 
  117.             '(vector-round 40 60 x)
  118.             section)
  119. --> (#(40 50 60) (4 5 6) #(40 50 60) (10 11 12))
  120.  
  121. Using Lambda Functions
  122.  
  123. If you want to supply calculated values within a function you must use a little more complex lambda form. Here is an example how such function might look like.
  124.  
  125. (defun transp-section (position pattern)
  126.   (let ((out pattern))
  127.     (dolist (elem position)
  128.       (setq out
  129.             (do-section elem
  130.                         #'(lambda (x)
  131.                             (symbol-transpose
  132.                              (transp-value (nth (- elem 1) pattern)) 
  133.                              x)) 
  134.                         out)))
  135.     out))
  136.